/**
 * 项目名称: Topic_387.cpp
 * 项目路径: study/DataStructure/刷题/一轮/第六天 数组+散列表
 * 编辑时间: 2024年09月07日09时17分58秒
 * 用   户: 轻尘
 */

#include <bits/stdc++.h>

using namespace std;

class Solution {
public:
    struct Node{
        int val;
        int cnt;
    };
    int ans = -1;
    const int N = 200003,null = 0x3f3f3f3f;
    Node h[200003];
    int find(int x){
        int k = (x%N+N)%N;
        while (h[k].val!=null && h[k].val!= x){
            k++;
            if(k==N)k=0;
        }
        return k;
    }
    int firstUniqChar(string s) {
        for(int i = 0 ;i<N;i++)h[i].val=null;
        for(int i = 0;i<s.length();i++){
            int v = s[i] - 'a';
            if(h[find(v)].val == null)h[find(v)].val = v;
            h[find(v)].cnt++;
        }

        for(int i = 0;i<s.length();i++){
            int v = s[i] - 'a';
            if(h[find(v)].cnt == 1)return i;
        }
        return ans;
    }
};